SSD加速HDD盘方案之bcache 您所在的位置:网站首页 Linux下SSD缓存加速之bcache使用 SSD加速HDD盘方案之bcache

SSD加速HDD盘方案之bcache

2024-05-18 23:47| 来源: 网络整理| 查看: 265

简介

https://static.antidebug.cn/2021-09-17-15-07-04.png bcache

Bcache是Linux内核块设备层cache, 支持将一个或多个速度较快的磁盘设备(如SSD)作为读写速度相对较慢的磁盘设备的cache. Bcache从Linux-3.10开始正式并入内核主线

Bcache具有以下特征:

一个缓存设备可以作为多个设备的缓存,并且可以在设备运行时动态添加和删除缓存 可以从非正常状态关机中恢复,只有当缓存写入到后端设备才会确认写完成 正确处理写阻塞和刷缓存 支持writethrough、writeback和writearound等写缓存模式 检测并避开顺序IO(可配置阈值,或关闭该选项) 当检测到SSD延迟超过配置边界值,减少到SSD流量(当一个SSD作为多个磁盘缓存时使用) 缓存不命中时预读(默认关闭) 高性能的writeback实现:脏数据通过排序后再刷到磁盘中。如果设置了writeback_percent值,后台的writeback进程利用PD控制器根据脏数据比例平滑地处理脏数据 使用高效率的B+树,硬件设备足够快速的情况下,bcache随机读可以达到1M IOPS 可在生产中稳定的使用 相关名词 cache device: (前端)缓存盘, 一般为SSD高速磁盘设备 backing device: 后端(数据)盘, 一般为HDD低速磁盘设备 缓存策略 writethrough (直写策略): 数据写入时, 必须SSD和HDD盘都写入成功, 写入请求才算完成, 写入请求才返回. 因此对于写入, 该策略并未有性能提升. 适用于读多写少的场景, 可以保证数据的强一致性 writeback (回写策略): 数据写入时, 只要SSD中写入成功, 写入请求就立即返回. SSD中的脏数据会由后台线程定时刷写到HDD盘中. 因此对于写入, 该策略会有明显的性能提升(除非到了SSD的性能瓶颈). 但是可能会造成数据丢失, 比较适用于底层有独立供电的RAID卡的服务器或者对数据一致性要求不是很高的场景 writearound (绕写 策略): 数据写入时, 绕过SSD, 直接写入到HDD盘中. 可以防止SSD因写I/O而填满, 导致以后不可重新读取. 缺点是: 当数据第一次读取, 由于写入时绕过了SSD, 因此会有SSD从HDD加载数据的操作 none: 读写操作都不会涉及到缓存盘, 将直接与后端磁盘交互, 相当于SSD是个摆设? 部署流程 1. 部署环境 1.1 系统环境 系统版本 内核版本 CentOS Linux release 7.7.1908 (Core) 3.10.0-1062.el7.x86_64 (需升级) 1.2 硬盘拓扑

由于是虚拟机环境, 所以用30G的HDD盘来模拟SSD盘

系统盘 前端缓存盘 后端数据盘 20G (sda) 30G (sdb) 100G (sdc) 2. 安装前准备 2.1 更新内核版本

在Centos7系列的内核中, 默认不支持bcache(未启用, 需要修改选项重新编译内核), 因此需要升级内核版本

个人感觉修改选项来重新编译内核比较繁琐, 而且编译后的内核还是之前的版本, 即3.10.x

该版本的内核对目前主流的应用支持的不是很好(有bug), 毕竟很老了, 可以升级内核的话最好升级内核

升级了内核版本能够体验很多新的功能特性, 如最近很火的eBPF

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 # 1. 载入公钥 [root@localhost opt]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # 2. 安装ELRepo [root@localhost opt]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm # 3. 载入elrepo-kernel元数据 [root@localhost opt]# yum --disablerepo=\* --enablerepo=elrepo-kernel repolist # 4. 安装最新的长期维护版本 (当前为: 5.4.146-1) [root@localhost opt]# yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt.x86_64 # 5. 配置grub2启动顺序 # 5.1 查看当前grub2启动顺序 [root@localhost opt]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg CentOS Linux (5.4.146-1.el7.elrepo.x86_64) 7 (Core) CentOS Linux (3.10.0-1062.el7.x86_64) 7 (Core) CentOS Linux (0-rescue-37da956671864c2d93da8d9bf2a76257) 7 (Core) # 5.2 配置grub2启动顺序, 默认启动的顺序是从0开始,根据上面实际展示的进行选择 [root@localhost opt]# grub2-set-default 0 # 6. 重启系统, 确认内核版本 [root@localhost opt]# reboot [root@localhost opt]# uname -a Linux localhost.localdomain 5.4.146-1.el7.elrepo.x86_64 #1 SMP Tue Sep 14 08:38:01 EDT 2021 x86_64 x86_64 x86_64 GNU/Linux # 7. 删除老内核以及内核工具包 [root@localhost opt]# rpm -qa|grep kernel|grep 3.10|xargs yum remove -y # 8. 安装新版本工具包 [root@localhost opt]# yum install perl -y [root@localhost opt]# yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt-tools.x86_64 [root@localhost opt]# yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt-devel.x86_64 [root@localhost opt]# yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt-headers.x86_64 [root@localhost opt]# yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-lt-tools-libs.x86_64 # 9. 确认已安装的内核工具包 [root@localhost ~]# rpm -qa | grep kernel kernel-lt-tools-libs-5.4.146-1.el7.elrepo.x86_64 kernel-lt-devel-5.4.146-1.el7.elrepo.x86_64 kernel-lt-5.4.146-1.el7.elrepo.x86_64 kernel-lt-tools-5.4.146-1.el7.elrepo.x86_64 kernel-lt-headers-5.4.146-1.el7.elrepo.x86_64 3. 部署bcache 3.1 加载内核模块

bcache已被合并进了linux内核中, 因此只需要确保对应的内核模块已加载即可

1 2 3 4 5 6 7 8 [root@localhost ~]# lsmod | grep bcache # 加载内核模块 [root@localhost ~]# modprobe bcache [root@localhost ~]# lsmod | grep bcache bcache 245760 0 crc64 16384 1 bcache 3.2 编译安装bcace-tools 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 # 安装依赖包 [root@localhost ~]# yum install libblkid-devel -y # 安装gcc [root@localhost ~]# yum install gcc -y # 安装git [root@localhost ~]# yum install git -y [root@localhost ~]# cd /opt # 下载bcace-tools源码 [root@localhost opt]# git clone https://gitee.com/yinianzhiyue/bcache-tools.git [root@localhost opt]# cd bcache-tools/ # 编译安装 [root@localhost bcache-tools]# make && make install # 验证bcache-tools是否安装成功 [root@localhost opt]# make-bcache Please supply a device Usage: make-bcache [options] device -C, --cache Format a cache device -B, --bdev Format a backing device -b, --bucket bucket size -w, --block block size (hard sector size of SSD, often 2k) -o, --data-offset data offset in sectors --cset-uuid UUID for the cache set --writeback enable writeback --discard enable discards --cache_replacement_policy=(lru|fifo) -h, --help display this help and exit 3.3 配置bcache 3.3.1 查看当前磁盘设备 1 2 3 4 5 6 7 8 9 10 11 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # sdb为模拟的SSD前端缓存盘 sdb 8:16 0 30G 0 disk # sdc为后端数据盘 sdc 8:32 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot 3.3.2 手工创建bcache设备

如对手工操作比较熟悉了, 可以跳过手工的步骤. 可直接参考步骤3.3.3来一键创建bcache设备

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 # make-bcache # -C 用来指定高速缓存盘, 即SSD盘 # -B 用来指定慢速数据盘, 即HDD盘 # 1. 创建backing device [root@localhost opt]# make-bcache -B /dev/sdc UUID: 12117060-d332-4736-9c11-1dd668f01c16 Set UUID: e0f5b95d-1f37-413c-b7ba-5bb774fc7b07 version: 1 block_size: 1 data_offset: 16 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 30G 0 disk # 此时sdc下多了一个bcach0 sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 2. 创建cache device [root@localhost opt]# make-bcache -C /dev/sdb UUID: 08e78fb6-f6dd-4646-8376-a83d8f115f3c Set UUID: bf560b4a-2217-43d5-9ccb-aaccfba6c1b8 version: 0 nbuckets: 61440 block_size: 1 bucket_size: 1024 nr_in_set: 1 nr_this_dev: 0 first_bucket: 1 # 创建device时, 可以通过--block参数来指定后端设备的扇区大小, --bucket参数来指定前端设备的erase block size --block, 指定后端设备的扇区大小, 默认512B --bucket, 指定前端设备的erase block size, 应与超速缓存设备的擦除块大小匹配, 以便减少写入放大现象 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # 因为目前尚未关联bcache设备, 因此sdb下目前还看不到任何的bcache设备 sdb 8:16 0 30G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 3. 将cache device绑定至bcacheX设备(建立关联关系), 这样高速设备才能为低速设备提供缓存作用 # 慢速设备/dev/sdc -> 通过创建后端设备 -> 创建了/dev/bcache0设备 # 高速设备/dev/sdb -> 通过创建前端设备 -> 相当于登记了高速设备的信息? # 前端设备 -> 建立关联关系 -> /dev/bcache0, 这样就实现了高速设备为低速设备提供缓存的功能 # 查看前端设备的cset.uuid信息 [root@localhost opt]# bcache-super-show /dev/sdb sb.magic ok sb.first_sector 8 [match] sb.csum 6B0C38BBADF032B2 [match] sb.version 3 [cache device] dev.label (empty) dev.uuid 08e78fb6-f6dd-4646-8376-a83d8f115f3c dev.sectors_per_block 1 dev.sectors_per_bucket 1024 dev.cache.first_sector 1024 dev.cache.cache_sectors 62913536 dev.cache.total_sectors 62914560 dev.cache.ordered yes dev.cache.discard no dev.cache.pos 0 dev.cache.replacement 0 [lru] cset.uuid bf560b4a-2217-43d5-9ccb-aaccfba6c1b8 # 前端设备与bcache0建立关联关系 [root@localhost opt]# echo "bf560b4a-2217-43d5-9ccb-aaccfba6c1b8" > /sys/block/bcache0/bcache/attach [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # 建立关联关系后, 此时sdb下就可以看到bcache设备了 sdb 8:16 0 30G 0 disk └─bcache0 252:0 0 100G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 此时一个基本的bacache就已经配置好了 3.3.3 一键创建bcache设备

在熟悉了手工创建的流程后, 后期操作就可以通过命令来一键创建了

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 # make-bcache # -C 用来指定高速缓存盘, 即SSD盘 # -B 用来指定低速数据盘, 即HDD盘 # 创建device时, 可以通过--block参数来指定后端设备的扇区大小, --bucket参数来指定前端设备的erase block size --block, 指定后端设备的扇区大小, 默认512B --bucket, 指定前端设备的erase block size, 应与超速缓存设备的擦除块大小匹配, 以便减少写入放大现象 # 例如, 如果使用具有4k扇区的硬盘和具有2MB擦除块大小的SSD # [root@localhost opt]# make-bcache --block 4k --bucket 2M -C /dev/sdc # 一块高速缓存盘可以为多块低速盘加速, 因此如果有多块盘时, -B可以连续给多个 # 如: make-bcache -C /dev/sdb -B /dev/sdc /dev/sdd /dev/sde # 这里演示只有一块低速盘 [root@localhost opt]# make-bcache -C /dev/sdb -B /dev/sdc UUID: 3e338886-3ca9-424e-a674-e82017ca1f1a Set UUID: 2833dcdc-685a-49d2-9908-33ae234402ca version: 0 nbuckets: 61440 block_size: 1 bucket_size: 1024 nr_in_set: 1 nr_this_dev: 0 first_bucket: 1 UUID: f6316e33-47ef-4b34-8337-bc3b22df9f32 Set UUID: 2833dcdc-685a-49d2-9908-33ae234402ca version: 1 block_size: 1 data_offset: 16 # 再次查看当前磁盘设备 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 30G 0 disk └─bcache0 252:0 0 100G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 最终实现的效果与步骤3.3.2一致 3.4 使用bcache

直接把/dev/bcache0当做磁盘格式化分区挂载使用即可

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 # 格式化文件系统 [root@localhost opt]# mkfs.xfs /dev/bcache0 meta-data=/dev/bcache0 isize=512 agcount=4, agsize=6553600 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=26214398, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=12799, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 # 创建待挂载目录 [root@localhost opt]# mkdir /mydata # 挂载磁盘 [root@localhost opt]# mount /dev/bcache0 /mydata/ [root@localhost opt]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 976M 0 976M 0% /dev tmpfs 989M 0 989M 0% /dev/shm tmpfs 989M 8.7M 980M 1% /run tmpfs 989M 0 989M 0% /sys/fs/cgroup /dev/mapper/centos-root 17G 1.8G 16G 11% / /dev/sda1 1014M 139M 876M 14% /boot tmpfs 198M 0 198M 0% /run/user/0 # 已挂载成功 /dev/bcache0 100G 33M 100G 1% /mydata # 此时往挂载点/mydata中读写数据, 就能被ssd缓存了 [root@localhost opt]# dd if=/dev/zero of=/mydata/test_file bs=1M count=100 100+0 records in 100+0 records out 104857600 bytes (105 MB) copied, 0.329173 s, 319 MB/s [root@localhost opt]# ls -alh /mydata total 100M drwxr-xr-x. 2 root root 23 Sep 17 04:09 . dr-xr-xr-x. 19 root root 253 Sep 16 22:32 .. -rw-r--r--. 1 root root 100M Sep 17 04:09 test_file 3.5 bcache相关操作 3.5.1 查看当前bcache状态 no cache: 该backing device没有attach任何caching device clean: 一切正常,缓存是干净的 dirty: 一切正常,已启用回写,缓存是脏的 inconsistent: 遇到问题,后台设备与缓存设备不同步 1 2 [root@localhost opt]# cat /sys/block/bcache0/bcache/state clean 3.5.2 查看当前缓存数据量及调整回写阈值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@localhost opt]# cat /sys/block/bcache0/bcache/dirty_data 0.0k # 当缓存策略为writeback时, 运行一段时间后会有一定的缓存数据量 [root@localhost opt]# cat /sys/block/bcache0/bcache/dirty_data 24.7G # 有几个参数来控制缓存的回写时机, 参数均在: /sys/block/bcache0/bcache/ 目录下 - writeback_percent: 如果非零, bcache会尝试保持这个百分比的缓存脏数据, 限制后台回写并使用PD控制器平滑调整比率, 默认10 (脏数据量占SSD磁盘空间的百分之十时才开始回写, 否则一直在SSD中?) - writeback_delay: 当脏数据写入缓存并且之前没有包含任何数据时, 在启动写回之前等待一些秒数. 默认为30 - writeback_rate: 每秒扇区速率, 如果writeback_percent非零, 则回写被限制到这个速率. 由bcache不断调整, 但可能也可以由用户设置 - writeback_running: 如果关闭, 则不会发生脏数据的回写, 脏数据仍将被添加到缓存中, 直到其将要满时. 仅用于基准测试. 默认开启 # 将writeback_percent调整至0, 也就意味着会将所有的dirty data都刷到backing device中 [root@localhost opt]# echo 0 > /sys/block/bcache0/bcache/writeback_percent 3.5.3 查看及调整缓存策略 1 2 3 4 5 6 7 8 9 10 # 查看当前默认策略 [root@localhost opt]# cat /sys/block/bcache0/bcache/cache_mode [writethrough] writeback writearound none # 修改缓存策略为: writeback [root@localhost opt]# echo writeback > /sys/block/bcache0/bcache/cache_mode # 再次查看 [root@localhost opt]# cat /sys/block/bcache0/bcache/cache_mode writethrough [writeback] writearound none 3.5.4 新增低速盘并关联高速缓存盘

bcache支持一块前端高速SSD盘加速多块后端低速盘, 因此如果需要添加新的低速盘, 请参考如下操作

当数据盘容量不足需要扩容时, 可参考下图, 在bcache上增再套一层lvm, 通过lvm可以很方便的实现后期扩容

https://static.antidebug.cn/2021-09-17-17-33-47.png lvm-bcache

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # 新增了一块70G的盘作为新增的低速盘 sdd 8:48 0 70G 0 disk sdb 8:16 0 30G 0 disk └─bcache0 252:0 0 100G 0 disk /mydata sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk /mydata sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 创建新的后端设备 [root@localhost opt]# make-bcache -B /dev/sdd UUID: 6b42714b-5303-47f2-8c0d-b5b259986ebf Set UUID: 0003aa98-3cfd-4167-b1d0-5e7b06b63e63 version: 1 block_size: 1 data_offset: 16 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # 此时sdd下多了一个bcache1 # 注意: 新增的后端设备并不会与之前的相同, 而是会创建一个新的bcaheX # 也就是说, 如果之前的盘容量不够用, 想增加新盘来扩容, 默认是不行的? # 可以在上层再套一层lvm, 后期需要扩容的话通过lvm来实现, 感觉可行, 在网上也看到了类似的架构图, 见上图 sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk sdb 8:16 0 30G 0 disk └─bcache0 252:0 0 100G 0 disk /mydata sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk /mydata sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 与之前的前端缓存盘建立关联关系 # 查看前端设备的cset.uuid信息 [root@localhost opt]# bcache-super-show /dev/sdb sb.magic ok sb.first_sector 8 [match] sb.csum 6B0C38BBADF032B2 [match] sb.version 3 [cache device] dev.label (empty) dev.uuid 08e78fb6-f6dd-4646-8376-a83d8f115f3c dev.sectors_per_block 1 dev.sectors_per_bucket 1024 dev.cache.first_sector 1024 dev.cache.cache_sectors 62913536 dev.cache.total_sectors 62914560 dev.cache.ordered yes dev.cache.discard no dev.cache.pos 0 dev.cache.replacement 0 [lru] cset.uuid bf560b4a-2217-43d5-9ccb-aaccfba6c1b8 [root@localhost opt]# echo "bf560b4a-2217-43d5-9ccb-aaccfba6c1b8" > /sys/block/bcache1/bcache/attach [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk # 建立关联关系后, 高速缓存盘sdb下就会增加新的bcache设备了 sdb 8:16 0 30G 0 disk ├─bcache0 252:0 0 100G 0 disk /mydata └─bcache1 252:128 0 70G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk /mydata sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot 3.5.5 删除后端低速盘

每一块低速盘(HDD)在经过make-bcache后, 都会对应一个bcacheX设备, 删除低速盘就是将对应的bcacheX设备停掉(删掉). 如果该bcacheX设备有绑定前端盘(SSD), 需要先解除与前端盘的关联

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk └─bcache3 252:384 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk sdb 8:16 0 30G 0 disk ├─bcache0 252:0 0 100G 0 disk └─bcache1 252:128 0 70G 0 disk sde 8:64 0 10G 0 disk └─bcache2 252:256 0 10G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 当前环境bcache情况如下: - /dec/sdb: 前端盘(SSD), 并且绑定了bcache0和bcache1 - /dev/sdc: 后端盘(HDD), 对应的bcache设备为bcache0 - /dev/sdd: 后端盘(HDD), 对应的bcache设备为bcache1 - /dev/sde: 后端盘(HDD), 对应的bcache设备为bcache2 - /dev/sdf: 后端盘(HDD), 对应的bcache设备为bcache3

下面演示了如何删除所有的后端盘, 包括: 绑定了前端缓存盘和未绑定前端缓存盘的情况

3.5.5.1 删除未绑定前端缓存盘的后端盘 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk └─bcache3 252:384 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk sdb 8:16 0 30G 0 disk ├─bcache0 252:0 0 100G 0 disk └─bcache1 252:128 0 70G 0 disk sde 8:64 0 10G 0 disk └─bcache2 252:256 0 10G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 未绑定前端缓存盘的后端盘列表如下: - /dev/sde - /dev/sdf # 删除后端盘sde # 在lsblk中可以看到, sde对应的bcache设备为bcache2 # 停掉对应的bcache设备即可 [root@localhost opt]# echo 1 > /sys/block/bcache2/bcache/stop # 再次查看 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk └─bcache3 252:384 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk sdb 8:16 0 30G 0 disk ├─bcache0 252:0 0 100G 0 disk └─bcache1 252:128 0 70G 0 disk # 此时sde对应的bcache设备已经没有了 sde 8:64 0 10G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 后端盘sdf同理 # sdf对应bcache3 [root@localhost opt]# echo 1 > /sys/block/bcache3/bcache/stop [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # sdf对应的bcache设备也没了 sdf 8:80 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk sdb 8:16 0 30G 0 disk ├─bcache0 252:0 0 100G 0 disk └─bcache1 252:128 0 70G 0 disk sde 8:64 0 10G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot 3.5.5.2 删除绑定了前端缓存盘的后端盘 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 # 对于绑定了前端缓存盘的后端盘, 在删除前需要先移除绑定的前端盘, 然后再对后端盘进行删除 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk sdb 8:16 0 30G 0 disk ├─bcache0 252:0 0 100G 0 disk └─bcache1 252:128 0 70G 0 disk sde 8:64 0 10G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 绑有前端缓存盘的后端盘列表如下: - /dev/sdc - /dev/sdd # 删除后端盘sdc # sdc对应的bcache设备为bcache0, bcache0上绑定了前端盘sdb # 移除bcache0前端盘的绑定 # 1. 获取前端盘sdb的cset.uuid [root@localhost opt]# bcache-super-show /dev/sdb sb.magic ok sb.first_sector 8 [match] sb.csum BFF5D72B4A323990 [match] sb.version 3 [cache device] dev.label (empty) dev.uuid 3e338886-3ca9-424e-a674-e82017ca1f1a dev.sectors_per_block 1 dev.sectors_per_bucket 1024 dev.cache.first_sector 1024 dev.cache.cache_sectors 62913536 dev.cache.total_sectors 62914560 dev.cache.ordered yes dev.cache.discard no dev.cache.pos 0 dev.cache.replacement 0 [lru] cset.uuid 2833dcdc-685a-49d2-9908-33ae234402ca # 2. 通过获取到的cset.uuid移除bcache0的绑定 [root@localhost opt]# echo "2833dcdc-685a-49d2-9908-33ae234402ca" > /sys/block/bcache0/bcache/detach # 验证是否移除 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk # 此时sdb下的bcache0已经没有了 sdb 8:16 0 30G 0 disk └─bcache1 252:128 0 70G 0 disk sde 8:64 0 10G 0 disk sdc 8:32 0 100G 0 disk └─bcache0 252:0 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 删除后端盘sdc [root@localhost opt]# echo 1 > /sys/block/bcache0/bcache/stop [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk sdb 8:16 0 30G 0 disk └─bcache1 252:128 0 70G 0 disk sde 8:64 0 10G 0 disk # 此时sdc的bcache0设备已经没了 sdc 8:32 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 同理, 删除后端盘sdd # sdd对应的bcache设备为bcache1 # 移除bcache1前端盘的绑定 [root@localhost opt]# echo "2833dcdc-685a-49d2-9908-33ae234402ca" > /sys/block/bcache1/bcache/detach [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk sdd 8:48 0 70G 0 disk └─bcache1 252:128 0 70G 0 disk # sdb下已经没了 sdb 8:16 0 30G 0 disk sde 8:64 0 10G 0 disk sdc 8:32 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot # 删除后端盘sdd [root@localhost opt]# echo 1 > /sys/block/bcache1/bcache/stop [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdf 8:80 0 10G 0 disk sdd 8:48 0 70G 0 disk sdb 8:16 0 30G 0 disk sde 8:64 0 10G 0 disk sdc 8:32 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot 3.5.6 删除前端高速缓存盘 1 2 3 4 5 6 7 8 9 10 11 12 # 在步骤3.5.5中只是移除了前端高速盘与bcacheX设备的关联关系, 但并未删除前端高速缓盘 # 还记得步骤3.3.2中的make-bcache -C吗? # 感觉-C的注册信息是被放在了/sys/fs/bcache/下, bf560b4a-2217-43d5-9ccb-aaccfba6c1b8为高速缓存盘的cset.uuid [root@localhost opt]# ls /sys/fs/bcache/ bf560b4a-2217-43d5-9ccb-aaccfba6c1b8 pendings_cleanup register register_quiet # 取消前端高速缓存盘的注册 [root@localhost opt]# echo 1 >/sys/fs/bcache/bf560b4a-2217-43d5-9ccb-aaccfba6c1b8/unregister # 此时/sys/fs/bcache/下就没有相关信息了 [root@localhost opt]# ls /sys/fs/bcache/ pendings_cleanup register register_quiet 3.6 相关问题 3.6.1 Already a bcache device on /dev/sdX, overwrite with –wipe-bcache 1 2 3 4 5 6 7 8 9 10 [root@localhost opt]# make-bcache -B /dev/sdc Already a bcache device on /dev/sdc, overwrite with --wipe-bcache # 这是因为之前这块盘已经make-bcache过了, 可能出现在反复试验的时间, 多次创建、删除 [root@localhost opt]# make-bcache -B /dev/sdc --wipe-bcache UUID: 3b3c8cd1-864b-4fdb-9283-a2e212d0d290 Set UUID: 92d8465a-0720-4b30-8f7d-988abdf3ee85 version: 1 block_size: 1 data_offset: 16 3.6.2 Can’t open dev /dev/sdX: Device or resource busy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 # 这个错误出现在我试验过程中, 在重新创建前端高速缓存设备的时间 # 这是因为前端高速缓存设备已经创建过了, 并未删除导致的 # 可参考步骤3.5.6的方法进行删除 [root@localhost opt]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb 8:16 0 30G 0 disk sdc 8:32 0 100G 0 disk sda 8:0 0 20G 0 disk ├─sda2 8:2 0 19G 0 part │ ├─centos-swap 253:1 0 2G 0 lvm [SWAP] │ └─centos-root 253:0 0 17G 0 lvm / └─sda1 8:1 0 1G 0 part /boot [root@localhost opt]# make-bcache -C /dev/sdb Can't open dev /dev/sdb: Device or resource busy # 查看前端高速缓存设备注册信息? [root@localhost opt]# ls /sys/fs/bcache/ 0b241b68-c354-461d-9ca1-ea00448057a9 pendings_cleanup register register_quiet # 由于当前系统是干净的, 但是/sys/fs/bcache/目录下存在注册信息, 应该是忘记删除导致的 # 对该注册信息进行删除(取消注册) [root@localhost opt]# echo 1 >/sys/fs/bcache/0b241b68-c354-461d-9ca1-ea00448057a9/unregister [root@localhost opt]# ls /sys/fs/bcache/ pendings_cleanup register register_quiet # 重新创建前端高速缓存设备 [root@localhost opt]# make-bcache -C /dev/sdb --wipe-bcache UUID: ba550b3f-646b-4740-8192-b9b2bebc3d63 Set UUID: f8361f22-92c3-421e-8a21-e5a5c6997508 version: 0 nbuckets: 61440 block_size: 1 bucket_size: 1024 nr_in_set: 1 nr_this_dev: 0 first_bucket: 1 [root@localhost opt]# ls /sys/fs/bcache/ f8361f22-92c3-421e-8a21-e5a5c6997508 pendings_cleanup register register_quiet 4. 调优参考 4.1 设置writeback提高写性能 1 2 3 # 数据写入时, 只要SSD中写入成功, 写入请求就立即返回. SSD中的脏数据会由后台线程定时刷写到HDD盘中. 因此对于写入, 该策略会有明显的性能提升(除非到了SSD的性能瓶颈). 但是可能会造成数据丢失, 比较适用于底层有独立供电的RAID卡的服务器或者对数据一致性要求不是很高的场景 [root@localhost opt]# echo writeback > /sys/block/bcacheX/bcache/cache_mode 4.2 允许缓存顺序I/O 1 2 # 默认情况下, bcache不会缓存顺序IO和大文件, 所以顺序写性能应该没什么提升. 可以打开顺序IO缓存 [root@localhost opt]# echo 0 > /sys/block/bcacheX/bcache/sequential_cutoff 4.3 调整顺序IO阈值 1 2 3 4 5 # 调整backing设备的顺序IO阈值, 默认是4M, 也就是说如果bcache设备的连续IO达到4MB以上时是直接读写backing盘, 不会走SSD缓存盘, 如果要设置成8M, 则可如下 [root@localhost opt]# echo "8M" > /sys/block/bcacheX/bcache/sequential_cutoff # 实际测试时报错。。。 -bash: echo: write error: Invalid argument 4.4 关闭拥塞控制项 1 2 3 # 这种情况最可能发生在一块缓存磁盘作为多个普通盘的缓存磁盘, 写入或读取处理不过来时, 就会形成堵塞, 这时我们可以关闭拥塞控制项. 默认情况下, 当读请求超过2ms, 写请求超过20ms时就会直接读写backing盘 [root@localhost opt]# echo 0 > /sys/fs/bcache/{cache set uuid}/congested_read_threshold_us [root@localhost opt]# echo 0 > /sys/fs/bcache/{cache set uuid}/congested_write_threshold_us 5. 参考资料 【武汉LUG】 Bcache Linux块设备层加速缓存现状与发展 鲲鹏BoostKit: Bcache OpenSUSE: 用于块设备操作的多层超速缓存 Linux Kernel: A block layer cache (bcache) CentOS7 安装bcache加速 SSD加速SATA盘之bcache策略 LVM之Cache加速 bcache配置使用 bcache bcache/如何使用bcache构建LVM,软RAID/如何优化bcache bcache 状态/配置 文件详细介绍(翻译自官网)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有